Install packages

if (!require("readr")) install.packages("readr")       # Package needed to Import csv and txt files
if (!require("dplyr")) install.packages("dplyr")       # Package needed to arrange filter etc 
if (!require("tidyr")) install.packages("tidyr")
if (!require("plotly")) install.packages("plotly")
if (!require("fitdistrplus")) install.packages("fitdistrplus")
if (!require("logspline")) install.packages("logspline")    

Laden der benötigten Packages

library(dplyr)
library(tidyr)
library(plotly)
library(readr)

#Package zum finden von passenden Verteilungen
library(fitdistrplus) 
library(logspline)

1. Aufgabe

Einlesen der Excel-Tabellen mithilfe von read.csv aus dem readr-Package

k7 <- read.csv("Data/Logistikverzug/Komponente_K7.csv", sep = ";")

log_delay_k7 <- read.csv("Data/Logistikverzug/Logistikverzug_K7.csv")

Verbinden der eingelesenen Tabellen zu der neuen Tabelle logistic_delay

logistic_delay <- log_delay_k7

logistic_delay <- logistic_delay %>%
 
#inner-join wird gewählt, da es nur Sinn ergibt, Parts die in beiden Tabellen aufgeführt sind, für die weitere Bearbeitung zu betrachten
  
inner_join(k7, by = "IDNummer", suffix = c("_Eingang", "_Produktion"))

Für die weitere Berechnung müssen die Daten, die noch als String vorliegen, in den Datentyp Date geändert werden

logistic_delay <- logistic_delay %>%
  mutate(Wareneingang = as.Date(Wareneingang, format = "%Y-%m-%d")) %>%
  mutate(Produktionsdatum = as.Date(Produktionsdatum, format = "%Y-%m-%d"))

Neue Spalte erstellen in der der Verzug angegeben wird. Dabei werden die zwei Tage berücksichtigt, die für die zusammenstellung der Teile benötigt werden.

logistic_delay <- logistic_delay %>%
  mutate(delay = Wareneingang - Produktionsdatum - 2) 

a) Herausfinden und testen, welche Verteilung am besten zu den Daten passt.

Dazu wird das Vorgehen nach StackExange benutzt. Dabei wird das fitdistrplus-Package gebraucht.

Zunächst wird der Cullen-and-Frey-Graph geplottet, um geeignete Kandidaten für die
Verteilung zu finden.

#Um descdist verwenden zu können, müssen die Einträge von delay numerisch sein

logistic_delay <- logistic_delay %>%
  mutate(delay = as.numeric(delay)) 


descdist(logistic_delay$delay)

## summary statistics
## ------
## min:  2   max:  13 
## median:  5 
## mean:  5.080437 
## estimated sd:  1.012302 
## estimated skewness:  0.5674067 
## estimated kurtosis:  3.630055

Laut dem Cullen-and-Frey-Graph würden als geeignete Kandiaten die Normalverteilung, die Weibull-Verteilung, die Gamma-Verteilung und die logarithmische Normalverteilung in Frage kommen.

Nun werden die ausgewählten Kandidaten mit der fitdist-Funktion anhand der Daten getestet. Es werden vier verschiedene Plots pro verteilungsart erstellt, welche dann optisch ausgewertet werden.

#Die jeweiligen Verteilungn werden für die Daten von "delay" berechnet 
fit.norm <- fitdist(logistic_delay$delay, "norm")
fit.weibull <- fitdist(logistic_delay$delay, "weibull")
fit.gamma <- fitdist(logistic_delay$delay, "gamma")
fit.lnorm <- fitdist(logistic_delay$delay, "lnorm")

#Die Plots werden für die erstellten Verteilungen erzeugt.
plot(fit.norm)

plot(fit.weibull)

plot(fit.gamma)

plot(fit.lnorm)

#Die Plots werden für die erstellten Verteilungen erzeugt.
plot(fit.norm)

plot(fit.weibull)

plot(fit.gamma)

plot(fit.lnorm)

Beim Vergleichen der Plots fällt am deutlichsten auf, dass beim Q-Q-Plot nur die logarithmische Normalverteilung ein zufriedenstellendes Ergebnis erzeugt und in den anderen Plots den anderen Kandidaten in nichts nachsteht.

Um das vorläufige Ergebnis zu verifizieren wird nun ein weiterer Test durchgeführt. Dafür wird das Akaike-Informationskriterium bestimmt und mit einander verglichen.

fit.weibull$aic
## [1] 907856.5
fit.norm$aic
## [1] 877278.6
fit.gamma$aic
## [1] 863021.8
fit.lnorm$aic
## [1] 862009.5

Wie zu sehen ist, wird der niedrigste Wert für die logarithmische Normalverteilung ausgegeben. Also ergibt auch dieser Test, dass die logarithmische Normalverteilung am besten geeignet ist.

b) Berechnen des minmalen/maximalen Zeitverzugs

minimaler_Zeitverzug <- min(logistic_delay$delay)

maximaler_Zeitverzug <- max(logistic_delay$delay)

minimaler_Zeitverzug 
## [1] 2
maximaler_Zeitverzug 
## [1] 13

Der minimale zeitverzug beträgt 2 Tage und der maximale zeitverzug beträgt 13 Tage.

c) Berechnen des durchschnittlichen Zeitverzugs

durchschnittlicher_zeitverzug <- mean(logistic_delay$delay)

durchschnittlicher_zeitverzug
## [1] 5.080437

Der durchschnittliche zeitverzug beträgt 5.080437 Tage.

d) Erstellen des Plots der gewählten verteilung

density <- density(logistic_delay$delay)

plot_ly (
  logistic_delay,  
  x = ~delay,
  type = "histogram", mode = 'none', opacity=0.85, color='red') %>%
  
   layout(title = "Logistische Verzögerungen der Komponente K7",
         xaxis = list(title = "Tage der Verzögerung",
                      zeroline = FALSE),
         yaxis = list(title = "Anzahl der Verzögerten Teile",
                      zeroline = FALSE))

2. Aufgabe

3. Aufgabe

Einlesen der Excel-Tabelle der Zulassungen und der Tabelle der Komponenten der Fahrzeuge

Zulassungen <- read.csv("Data/Zulassungen/Zulassungen_alle_Fahrzeuge.csv", sep = ";")

OEM1_Typ_11 <- read.csv("Data/Fahrzeug/Bestandteile_Fahrzeuge_OEM1_Typ11.csv", sep = ";")

OEM1_Typ_12 <- read.csv("Data/Fahrzeug/Bestandteile_Fahrzeuge_OEM1_Typ12.csv", sep = ";")

OEM2_Typ_21 <- read.csv("Data/Fahrzeug/Bestandteile_Fahrzeuge_OEM2_Typ21.csv", sep = ";")

OEM2_Typ_22 <- read.csv("Data/Fahrzeug/Bestandteile_Fahrzeuge_OEM2_Typ22.csv", sep = ";")

Prüfen, in welchen Autotypen das Teil K7 Anwendung findet

OEM1_Typ_11_K7 <- OEM1_Typ_11 %>%

filter(substr(ID_Karosserie, start = 1, stop = 2) == "K7")

nrow(OEM1_Typ_11_K7)
## [1] 0
OEM1_Typ_12_K7 <- OEM1_Typ_12 %>%

filter(substr(ID_Karosserie, start = 1, stop = 2) == "K7")

nrow(OEM1_Typ_12_K7)
## [1] 0
OEM2_Typ_21_K7 <- OEM2_Typ_21 %>%

filter(substr(ID_Karosserie, start = 1, stop = 2) == "K7")

nrow(OEM2_Typ_21_K7)
## [1] 0
OEM2_Typ_22_K7 <- OEM2_Typ_22 %>%

filter(substr(ID_Karosserie, start = 1, stop = 2) == "K7")

nrow(OEM2_Typ_22_K7)
## [1] 306490

Komponente K7 befindet sich nur in OEM-Typ-22-Fahrzeugen.

Verbinden der eingelesenen Tabellen Zulassungen und OEM_Typ_22 zu der neuen Tabelle k7_Zulassungen

#Erst werden die Zulassungen nach der Gemeinde Dahlem (Eifel) gefiltert


Zulassungen_Dahlem <- Zulassungen %>%

filter(Gemeinden == "DAHLEM")


#Inner-join wird gewählt, um nur die Daten zu erhalten, welche in beiden Tabellen vorkommen

k7_Zulassungen_Dahlem <- Zulassungen_Dahlem %>%
  
inner_join(OEM2_Typ_22, by = c("IDNummer" = "ID_Fahrzeug")) 


#Da die Tabelle jetzt nur noch Einträge von in Dahlem zugelassenen Autos mit K7-Komponenten enthält, können nun die Zeilen ausgezählt werden

nrow(k7_Zulassungen_Dahlem)
## [1] 0

In Dahlem (Eiffel) befinden sich 0 registrierte Autos mit der Komponente K7.

4. Aufgabe

#Einlesen des benötigten Datatables
Zulassungen <- read.csv("Data/Zulassungen/Zulassungen_alle_Fahrzeuge.csv", sep = ";")

#Herausfinden der Datentypen der Attribute
str(Zulassungen)
## 'data.frame':    3149691 obs. of  4 variables:
##  $ X        : chr  "408097" "408098" "1" "2" ...
##  $ IDNummer : chr  "11-1-11-1" "11-1-11-2" "12-1-12-1" "12-1-12-2" ...
##  $ Gemeinden: chr  "DRESDEN" "DRESDEN" "LEIPZIG" "LEIPZIG" ...
##  $ Zulassung: chr  "2009-01-01" "2009-01-01" "2009-01-01" "2009-01-01" ...
#Erstellen der Tabelle als Dataframe
Attribut <- c("x", "IDNummer", "Gemeinden", "Zulassung")

Datentyp <- c("numeric", "character", "character", "character")

Tabelle <- data.frame(Attribut, Datentyp)

knitr::kable(Tabelle)
Attribut Datentyp
x numeric
IDNummer character
Gemeinden character
Zulassung character

5. Aufgabe

6. Aufgabe

# Die Part Nummer K5-112-1122-79 lässt auf die Komponente K5 schließen. K5 ist eine Karosserie, deshalb suchen wir alle Fahrzeuge mit der Karosserie "K5-112-1122-79". Wir nehmen den ersten Eintrag in der Spalte ID_Fahrzeug (es gibt nur ein Element in der Spalte ID_Fahrzeug nach dem Filtern, da es keine Duplikate gibt).

b <- OEM1_Typ_12 %>% filter(ID_Karosserie == "K5-112-1122-79")

#Aus b kann man lesen, dass "12-1-12-82" die ID des Fahrzeugs ist.
id_vehicle <- b["ID_Fahrzeug"][[1]]

#Die Karosserie ist in der Tabelle Bestandteile_OEM1_Typ12 vorhanden. Nun wird die Id des Fahrzeugs mit den Zulassungen verglichen um die Frage wo das Auto registriert ist zu beantworten
HitRun <- filter(Zulassungen, IDNummer == id_vehicle)
HitRunOrt <- HitRun[,3]
HitRunOrt
## [1] "ASCHERSLEBEN"
#Das Auto ist in ASCHERSLEBEN zugelassen